package com.hainingtong.user.util;


import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.HashMap;

@Data
@ApiModel(value = "统一返回数据格式")
public class Result {

    @ApiModelProperty(value = "是否成功")
    private Boolean success;

    @ApiModelProperty(value = "返回码， 2000 表示成功")
    private Integer code;

    @ApiModelProperty(value = "返回消息")
    private String message;

    @ApiModelProperty(value = "返回数据")
    private Object data="";

    // 设置为私有，让这个类只能通过静态方法创建
    private Result() {
    }

    /**
     * 返回简单的成功信息
     * @return
     */
    public static Result ok() {
        return ok(new HashMap<>());
    }

    /**
     * 通过状态码生成成功类型
     * @param codeEnum
     * @return
     */
    public static Result ok(ResultCode codeEnum) {
        return ok(codeEnum,new HashMap<>());
    }

    /**
     * 返回简单的成功信息，并包含数据
     * @param data 携带的数据
     * @return
     */
    public static Result ok(Object data) {
        return ok(ResultCode.SUCCESS,data);
    }

    /**
     * 指定成功状态码，以及携带的数据
     * @param codeEnum
     * @param data
     * @return
     */
    public static Result ok(ResultCode codeEnum, Object data){
        Result r = new Result();
        r.setCode(codeEnum.getCode());
        r.setSuccess(codeEnum.getStatus());
        r.setMessage(codeEnum.getMessage());
        r.setData(data);
        return r;
    }

    /**
     * 未知原因的错误
     * @return
     */
    public static Result error() {
        return error(ResultCode.UNKNOWN_REASON);
    }

    /**
     * 指定错误原因
     * @param codeEnum
     * @return
     */
    public static Result error(ResultCode codeEnum) {
        return error(codeEnum,new HashMap<>());
    }

    public static Result error(Object data) {
        return error(ResultCode.UNKNOWN_REASON, data);
    }
    public static Result error(ResultCode codeEnum, Object data) {
        Result r = new Result();
        r.setCode(codeEnum.getCode());
        r.setSuccess(codeEnum.getStatus());
        r.setMessage(codeEnum.getMessage());
        r.setData(data);
        return r;
    }
}
